// Cipher - an encryption template
//
// Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>.  All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
//
// Visit the ACME Labs Java page for up-to-date versions of this and other
// fine Java utilities: http://www.acme.com/java/

/// An encryption template.
// <P>
// <A HREF="/resources/classes/Acme/Crypto/Cipher.java">Fetch the software.</A><BR>
// <A HREF="/resources/classes/Acme.tar.Z">Fetch the entire Acme package.</A>
// <P>
// @see StreamCipher
// @see BlockCipher
// @see EncryptedOutputStream
// @see EncryptedInputStream

import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

public class SysCipher {
  private String algorithm; // 算法，如DES

  private Key key; // 根据算法生成的密钥

  // 生成密钥

  public SysCipher(String algorithm) {
    this.algorithm = algorithm;
  }

  // 解密函数，将密文解密回原文

  public String decode(byte[] cipherText, Key k) {

    byte[] sourceText = null;

    try {

      Cipher cipher = Cipher.getInstance(algorithm);
      cipher.init(Cipher.DECRYPT_MODE, k); // 操作模式为解密,key为密钥

      sourceText = cipher.doFinal(cipherText);

    } catch (Exception e) {

      e.printStackTrace();
    }

    return new String(sourceText);
  }

  public Key initKey() {

    try {

      // 初始化密钥key

      KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);

      keyGenerator.init(56); // 选择DES算法,密钥长度必须为56位

      key = keyGenerator.generateKey(); // 生成密钥，每次生成的密钥都是不一样的

    } catch (Exception ex) {

      ex.printStackTrace();
    }

    return key;
  }

  // 加密函数，将原文加密成密文

  public byte[] encode(String plainText) {

    byte[] cipherText = null;

    try {

      // 生成Cipher对象

      Cipher cipher = Cipher.getInstance(algorithm);

      // 用密钥加密明文(plainText),生成密文(cipherText)

      cipher.init(Cipher.ENCRYPT_MODE, key); // 操作模式为加密(Cipher.ENCRYPT_MODE),key为密钥

      cipherText = cipher.doFinal(plainText.getBytes()); // 得到加密后的字节数组

      // String str = new String(cipherText);

    } catch (Exception e) {

      e.printStackTrace();
    }

    return cipherText;
  }
}
